/**
 * @file startup_monitor.h
 * @brief 认证服务启动状态监控器 - 监控服务启动过程和状态
 * @author 29108
 * @date 2025/8/2
 * @version 1.0
 *
 * 功能特性:
 * - 启动阶段监控
 * - 组件状态检查
 * - 启动失败诊断
 * - 启动时间统计
 * - 启动日志记录
 */

#ifndef STARTUP_MONITOR_H
#define STARTUP_MONITOR_H

#include <string>
#include <vector>
#include <chrono>
#include <mutex>

namespace core_services {
    namespace auth_service {

        /**
         * @brief 启动阶段枚举
         */
        enum class StartupStage {
            INITIALIZING,               ///< 初始化
            LOADING_CONFIG,             ///< 加载配置
            INITIALIZING_LOGGING,       ///< 初始化日志系统
            CHECKING_DEPENDENCIES,      ///< 检查依赖
            INITIALIZING_DATABASE,      ///< 初始化数据库
            INITIALIZING_COMPONENTS,    ///< 初始化业务组件
            STARTING_HTTP_SERVER,       ///< 启动HTTP服务器
            STARTING_KAFKA,             ///< 启动Kafka组件
            REGISTERING_SERVICES,       ///< 注册服务
            STARTING_BACKGROUND_TASKS,  ///< 启动后台任务
            COMPLETED,                  ///< 启动完成
            FAILED                      ///< 启动失败
        };

        /**
         * @brief 启动错误信息
         */
        struct StartupError {
            std::string component;                              ///< 组件名称
            std::string error_message;                          ///< 错误消息
            std::chrono::steady_clock::time_point timestamp;    ///< 错误时间戳
            StartupStage stage;                                 ///< 发生错误的阶段
        };

        /**
         * @brief 启动监控器类
         * @details 监控认证服务的启动过程，记录各阶段耗时和错误信息
         */
        class StartupMonitor {
        public:
            /**
             * @brief 构造函数
             */
            StartupMonitor();

            /**
             * @brief 析构函数
             */
            ~StartupMonitor() = default;

            /**
             * @brief 设置当前启动阶段
             * @param stage 启动阶段
             * @param description 阶段描述（可选）
             */
            void setStage(StartupStage stage, const std::string& description = "");

            /**
             * @brief 记录错误
             * @param component 组件名称
             * @param error 错误信息
             */
            void recordError(const std::string& component, const std::string& error);

            /**
             * @brief 记录成功
             * @param component 组件名称
             * @param message 成功消息
             */
            void recordSuccess(const std::string& component, const std::string& message);

            /**
             * @brief 检查是否有错误
             * @return 有错误返回true
             */
            bool hasErrors() const;

            /**
             * @brief 获取所有错误
             * @return 错误列表
             */
            std::vector<StartupError> getErrors() const;

            /**
             * @brief 获取总启动时间
             * @return 启动时间（毫秒）
             */
            std::chrono::milliseconds getTotalStartupTime() const;

            /**
             * @brief 获取当前阶段耗时
             * @return 当前阶段耗时（毫秒）
             */
            std::chrono::milliseconds getCurrentStageTime() const;

            /**
             * @brief 获取当前阶段
             * @return 当前启动阶段
             */
            StartupStage getCurrentStage() const { return current_stage_; }

            /**
             * @brief 打印启动摘要
             */
            void printSummary() const;

        private:
            StartupStage current_stage_;                        ///< 当前阶段
            std::chrono::steady_clock::time_point start_time_;  ///< 启动开始时间
            std::chrono::steady_clock::time_point stage_start_time_; ///< 当前阶段开始时间
            
            mutable std::mutex errors_mutex_;                   ///< 错误列表互斥锁
            std::vector<StartupError> errors_;                  ///< 错误列表

            /**
             * @brief 获取阶段描述
             * @param stage 启动阶段
             * @return 阶段描述字符串
             */
            std::string getStageDescription(StartupStage stage) const;
        };

        /**
         * @brief 获取全局启动监控器实例
         * @return 启动监控器引用
         */
        StartupMonitor& getStartupMonitor();

        /**
         * @brief 重置启动监控器
         */
        void resetStartupMonitor();

    } // namespace auth_service
} // namespace core_services

#endif // STARTUP_MONITOR_H
